package com.xsd.juc;

/**
 * @Description: 原子变量与 CAS 算法
 * @Author: zhoufuzong
 * @Created: 2021-01-10 20:46:30
 * @Version: 1.1.0
 */

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 一、i ++ 的原子性问题  实际分为 三个步骤  读-改-写
 *      int i=10;
 *      i = i ++; // 10
 *
 *      int  temp =i;
 *      i = i+ 1;
 *      原子性问题 ： 以上两步不可分割 ，不保证原子性问题，以上两步会被分割
 *      i =temp;
 *
 *二 、 原子变量：jdK1.5以后 java.util.concurrent.atmoic 包下提供了原子变量
 *      1、volatile 保证内存可见性
 *      2、CAS（Compare-And-Swap) 算法保证数据的原子性
 *              CAS算法 是硬件对于并发操作共享数据的支持
 *              CAS 包含了三个操作数：
 *              内存值： V
 *              预估值： A
 *              更新值： B
 *              当且仅当 V==A 时，V =B  否则 ，将不做任何操作
 *
 *
 *
 */

class AtomicDemo implements Runnable{
    private AtomicInteger serialNumber =new AtomicInteger();

    @Override
    public void run() {
        try{
            TimeUnit.MILLISECONDS.sleep(1); } catch(InterruptedException e) {e.printStackTrace();}
        System.out.println(Thread.currentThread().getName()+"\t"+getSerialNumber());
    }

    public int getSerialNumber(){
        return serialNumber.getAndIncrement();
    }
}
public class TestAtomicDemo {

    public static void main(String[] args) {
        AtomicDemo atomicDemo = new AtomicDemo();

        for (int i = 0; i <10 ; i++) {
           new Thread(atomicDemo).start();    
        }
    }


}
